package com.yanggu.spark.core.broadcast

import org.apache.spark.broadcast.Broadcast
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

//广播变量-spark三大数据结构中的一个, 另外两个是rdd、累加器
//分布式只读变量
//在sparkStreaming中使用的较多
//广播变量用来高效分发较大的对象。向所有工作节点发送一个较大的只读值，以供一个或多个Spark操作使用。比如，如果你的应用需要向所有节点发送一个较大的只读查询表，广播变量用起来都很顺手。在多个并行操作中使用同一个变量，但是 Spark会为每个任务分别发送。
object BroadCastDem0 {

  def main(args: Array[String]): Unit = {

    //获取环境
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("WordCount")

    //获取上下文
    val sc: SparkContext = new SparkContext(conf)

    val rdd1 = sc.makeRDD(List(("a", 1), ("b", 2), ("c", 3), ("d", 4)), 4)

    val list = List(("a", 4), ("b", 5), ("c", 6), ("d", 7))
    // 声明广播变量
    val broadcast: Broadcast[List[(String, Int)]] = sc.broadcast(list)

    //使用广播变量
    val resultRDD: RDD[(String, (Int, Int))] = rdd1.map {
      case (key, num) =>
        var num2 = 0
        // 使用广播变量
        for ((k, v) <- broadcast.value) {
          if (k == key) {
            num2 = v
          }
        }
        (key, (num, num2))
    }

    resultRDD.collect.foreach(println)

    sc.stop

  }

}
